gmid on RockyLinux9 (SELinux縛り)
#RockyLinux #gmid #gemini_protocol
packageとして提供されてないと大変なんだよな、依存関係整えたりするのが
$ dnf install libretls{,-devel} libbsd{,-devel,-ctor-static} libevent{,-devel}
yacc/bisonが足りないことに気がついた
アホ
$ dnf install byacc
$ ./configure
$ make
$ sudo make install
testでえらい怒られてるけど動いたのでok
resource/gmid.serviceとgmid.sysuserを規定の場所に置く
$ cp resource/gmid.service /etc/systemd/system/
$ cp gmid.sysusers /usr/lib/sysusers/gmid.conf
gencertする
なんで自己署名な証明書がgeminiでは主流なのかがわからん
gencertで証明書を生成できる
$ cp ./resource/gencert /usr/local/bin/gencert
$ systemctl edit gmid
code:conf
Service
ExecStart=
ExecStart=/usr/local/bin/gmid -f -c /etc/gmid/gmid.conf
てかgmidさんは、BSDにしかない関数もなければ提供されるのか、えらい!
selinuxのpolicyを生成する
$ sepolicy generate --init -n geminid /usr/local/bin/gmid
$ sepolicy generate --cgi -n geminid /usr/local/bin/gmid
どっちがいいんだろう
initへcgiの参考になりそうなものを入れていくか
これやると、gemini{.te,.pp,.if,.sh,_selinux.spec}が生成される
apache_content_templateってなんやねん
HTTP鯖の設定をそのまま鵜呑みにできないしなあ
https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/8/html/using_selinux/writing-a-custom-selinux-policy_using-selinux 参考にする
とりあえずpolicybuildするか
$ ./geminid.sh
rpmbuildがないと怒られたあ
何をするんだろう、rpmにするんだろうか
$ dnf install rpm-build
そもそもgeminid_selinux.specがrpmbuild用のファイルらしい
てかman pageも生成するのか、すげー
port typeなんやねん
geminid_port_t定義するだけではいかんのか
$ sudo semanage port -a -t geminid_port_t -p tcp 1965
ダメっぽい
corenet_reserved_port(hogehoge_port_t)らしい
https://danwalsh.livejournal.com/10607.html おっ
http://oss.tresys.com/docs/refpolicy/api/contrib.html おっ
systemdで起動すると動かない!
auditにもひっかからなく、stdout/stderrにも出てこないからどこへ吸収されているのやら……
Apache httpdの.teファイルを見様見真似で動かしているがなぜか動かないし、自作moduleに書いたはずのfcontextが反映されないしで厳しい
前者、systemctlで動かすと動かないっぽいが、cgroupが悪さをしている?
systemdから動かせばinit_tからroleが遷移するのに対し、cmdから動かせばunconfined_tからunconfined_tに対しroleが遷移するので、cgroupではなく、SELinuxの正常な動作な説があるな
packet_tが必要?
httpdにもこれが実装されてるんかなあ
$ sesearch -s httpd_t -c packet -A
allow httpd_t http_server_packet_t:packet { recv send }; ←おっ
これ実装すればなんとかなりそう?
どのマクロでpacket_tを定義すればええねん
リファレンスにねーんだが?
とりあえずソース読むか……
https://github.com/fedora-selinux/selinux-policy/blob/7e50553feb19abeab49911db46c15b50b6bda47e/policy/modules/kernel/corenetwork.if.m4#L26 おっ??
これは……?
interfaceってなんやねん!
m4を生成するm4じゃんね
https://github.com/fedora-selinux/selinux-policy/blob/6ba27c26452be0189109bc99acb3a97ddce58029/policy/modules/contrib/apache.te#L620 これ何?
corenet_sendrecv_http_server_packets(httpd_t)
これ、m4をm4で生成してそう
てかcan_execって何? https://github.com/fedora-selinux/selinux-policy/blob/6ba27c26452be0189109bc99acb3a97ddce58029/policy/modules/contrib/apache.if#L412
systemdがprocessを起動する段階で問題が起こっているのでは?という仮説の1つ
てかこれでも行けそうじゃね? https://github.com/fedora-selinux/selinux-policy/blob/ef940a3a4a811ccb0353d08478c487274d86f3ba/policy/modules/contrib/bind.te#L151
SELinux、m4で作られてるの真面目に考えるとヤバいな
corenet_*系を読むべきな気がした: http://oss.tresys.com/docs/refpolicy/api/kernel_corenetwork.html
corenet_tcp_bind_all_unreserved_ports
Bind TCP sockets to all ports > 1024.
geminiは1965なのでこれでもよさそう> corenet_reserved_port
corenet_tcp_bind_generic_node
Bind TCP sockets to generic nodes. This is necessary for binding a socket so it can be used for servers to listen for incoming connections.
corenet_tcp_bind_inetd_child_port
これvgerに使えそう
corenet_tcp_bind_socks_port←これは何?
corenet_tcp_connect_all_portsクソデカ権限っぽそうだけど大丈夫そ?
corenet_tcp_connect_all_unreserved_ports
corenet_tcp_connect_*とcorenet_tcp_bind_*って何が違うん?
corenet_tcp_recv_netlabelとかのnetlabelってなんやねん
unlabelと何が違うねん
label、このへんが参考になりそう: https://gist.github.com/akihikodaki/b47dcbdc51c9d95bc0748418442850c8#file-mastodon-te-L89
なるほど、CMDから指定したport番号からportを指定する感じか
corenet_client_packet
Define type to be a network client packet type
This is for supporting third party modules and its use is not allowed in upstream reference policy.
corenet_server_packet
Define type to be a network server packet type
This is for supporting third party modules and its use is not allowed in upstream reference policy.
なんか、ノリ的にはcorenet_reserved_portよりかはcorenet_portな気がする
参考: gmid on RockyLinux9 (SELinux縛り)#631211f98b8fcb0000c030f2
code:gmid.te
#corenet_reserved_port(gmid_port_t) #comment out
corenet_port(gmid_port_t)
corenet_client_packet(gmid_client_packet_t)
corenet_server_packet(gmid_server_packet_t)
corenet_tcp_bind_all_unreserved_ports(gmid_t) #added
corenet_tcp_bind_generic_node(gmid_t)
corenet_tcp_bind_generic_port(gmid_t)
corenet_tcp_connect_all_unreserved_ports(gmid_t) #added
corenet_tcp_sendrecv_generic_if(gmid_t)
corenet_tcp_recvfrom_labeled(gmid_t, gmid_port_t) #added
sysnet_dns_name_resolve(gmid_t)
なんか落ちたが
journalctlに手掛かりなし
とりあえずauditを見るか
$ less /var/log/messages
trableshootdをのメッセージがぐちゃぐたでみにくい
どう見るのがいいんだっけか
journalctl -xe じゃんね
$ sealert -l "*"
code:log
***** Plugin restorecon_source (41.9 confidence) suggests *****************
If you want to fix the label.
/usr/local/bin/gmid default label should be bin_t.
Then you can run restorecon.
Do
# /sbin/restorecon -v /usr/local/bin/gmid
え?init_daemon_domainでbin_t付与してくれるもんじゃないん?!
https://danwalsh.livejournal.com/54803.html ←あとで読む
https://tex2e.github.io/blog/linux/selinux-unrestricted-process
bin_t大丈夫そ??ガバそうだが……
そもそも、gmid_exec_tがそのへんうまくやってくれるんじゃ……
再起動したら直ったが
https://endy-tech.hatenablog.jp/entry/selinux_module_sources#File-Labeling-Policy-File-fc 参考になる
定義はkernelに入ってたか
corenet_reserved_portよりかはcorenet_portで合ってそう: https://github.com/fedora-selinux/selinux-policy/blob/6ba27c26452be0189109bc99acb3a97ddce58029/policy/modules/kernel/corenetwork.if.in#L52
port_typeとgmid_t分ける必要なかったのでは?
いや、corenet_tcp_recvfrom_labeledのためには必要だなあ